Skip to content

fix(engine): t8s4 CORS Range safelist + MSE 音频双面设计——bilibili DASH 段拉取修复 - #140

Merged
leizongmin merged 2 commits into
mainfrom
t8s4-cors-range-safelist
Oct 11, 2026
Merged

leizongmin merged 2 commits into
mainfrom
t8s4-cors-range-safelist

Conversation

@leizongmin

@leizongmin leizongmin commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

变化

bilibili 起播断链三角化终证(beacon 页面侧探针 + curl 双证):shim _zwPreNamesOf 把 Range 头当自定义头(源码注释原文点名)→ 跨域 GET 误发 CORS OPTIONS preflight → bilivideo CDN 对 OPTIONS 拒答(curl 实证:带 Origin 的 GET 回条件 ACAO;无 Origin/OPTIONS 无 ACAO)→ 预检失败 → 全部 CDN 候选 TypeError: Failed to fetch → DASH init 永不 appendBuffer → watchdog detach/retry 死循环 → 起播失败。fetch spec 2022+ 已将 Range 纳入 CORS-safelisted request-header(单一 simple range),Chrome/FF 拉媒体段从不预检。

  • part01.js _zwPreNamesOf:Range 值为单一 simple range(bytes=start-end / start- / -suffix)→ 免 preflight;多段/畸形仍触发。这是通用 CORS 修复——任何按 Origin 条件回 ACAO 的媒体 CDN 的 Range 拉取面都受益。
  • part06.js 双面设计(UA 纬度,Chrome 同款):isTypeSupported 音频真值收窄 mp4a.40.2+aac(symphonia-codec-aac 0.6.1 源码定谳只解 AAC-LC——sbr_present 显式拒;t8s-3 的 mp4a.40.* 前缀使 HE-AAC(40.5) 虚报 true,真站探针实测命中);addSourceBuffer 与解码面解耦为 ingest 面(40.x 家族受理)——实测 bilibili 未登录默认音轨 30216=HE-AAC,解码面硬拒使 nano sourceopen handler 中断、双轨 append 全死;ingest 受理后双 SourceBuffer 创建成功。桥存在门保留(t8n 契约零回归)。
  • part09.rs:双面钉(isTypeSupported(40.5)=false 解码面诚实 + addSourceBuffer(40.5)=created:audio ingest 受理)。

验证

  • 真站(decode-h264 构建,beacon 探针 out-t8s4-verify/):修复前段拉取全线 Failed to fetch;修复后 playurl fnval=4048 + dash:1 → sourceopen 派发(listeners=2)→ 双 SB 创建(ASB_OK×2) → 段拉取 FR 206(init 双轨)→ docker 全程 true(watchdog 死循环消除)。
  • 红绿钉测:test_fetch_range_safelisted_preflight_t8s4 三臂(simple range 零 OPTIONS / 多段 range OPTIONS 先行 / 普通自定义头守卫);红态变异=恢复旧行为后第一臂精准变红(left ["OPTIONS","GET"] vs right ["GET"]),/tmp md5 恢复。
  • 门禁:fmt CLEAN、clippy workspace+quickjs 双腿 -D warnings、engine lib 2987P(+2 钉;skip 1 基线既有栈溢出项——stash 对照实证)、make test exit 0。

已知边界(诚实披露)

  • 起播未达成:appendBuffer 仍未发生——断点在 nano(bilibili dash.js fork)loader→buffer controller 内部管道(段字节消费后到 SB append 之间),黑盒深度超出当前仪表能力(CDP Debugger 缺口见池 OBS-t8r4-2)。本切片交付 = CORS Range 拉取面 + 双轨 SB 创建面两阶段推进(公开可观测面),append 管道归下一切片。
  • HE-AAC(40.5)isTypeSupported=false 解码面诚实;ingest 受理后音频解码失败走静音降级(视频轨照常)——音频静默为已知降级形态,HE-AAC/SBR 解码归 MSE 深水区后续。
  • 上游 WPT:vendored wpt-data 无 fetch/api/cors 目录(离线不可导入验证),本地三臂钉兜底。

返修(双审查统一收口,93db1b295)

双首轮均 PASS(①测试有效性 0 阻断 4 非阻断——两处红绿变异闭环;②实现缺陷 0 阻断 5 非阻断——D1 regex fail-open 超集+注释失实等)。统一收口(非作者复核 APPROVE,suffix 臂红态判别实测):

  • D1:Range safelist 正则收紧 /bytes=\d+-\d*/(精确对齐 spec parse-a-single-range:无空白、start 必填、大小写敏感;suffix bytes=-500 spec 明言不 safelist)+ 分支/函数头注释 spec 转述修正(D4)。
  • D2/D3:appendBuffer 轨路由注释对齐实际行为(无门面构建 append 恒败 error 面);ingest codecs 提取补单引号形态。
  • D5 + 新臂:调试残留删除;新增 suffix range 拒绝臂(bytes=-500 → OPTIONS 先行;宽松正则变异下精准变红的回归守卫)。
  • 首轮①的 4 建议中值形态臂已由 suffix 臂部分覆盖,其余(OWS 臂、40.5 append 静音钉)转池下一切片。

返修后门禁:engine 2996P(+suffix 臂)/ fmt CLEAN / clippy 双腿 / make test exit 0(复核者独立复跑 20,524P 实证)。

审查状态(head 93db1b2)

  • 首轮①测试有效性:PASS(0 阻断)——两处红绿变异闭环;档案 reviews/t8s4-pr140/first-test-validity.md
  • 首轮②实现缺陷:PASS(0 阻断,D1-D5 非阻断)——spec 实文对照推演;档案 reviews/t8s4-pr140/first-defect.md
  • 统一收口:D1-D5 全闭合
  • 非作者补丁复核:APPROVE(五项闭合 + suffix 臂红态判别实测 + make test 独立复跑全绿;账面保留 R1 rustdoc 措辞/R2 值形态臂/R3 构造性残角转池);档案 reviews/t8s4-pr140/rework-nonauthor.md

截图

无适用画面(网络/CORS 层切片,无视觉差异;探针决策日志证据在审查档案)。


Note

Medium Risk
Touches cross-origin fetch preflight logic and MSE capability/ingest gates used for media playback; incorrect Range or codec rules could break CDN segment fetches or site codec probes.

Overview
Fixes bilibili-style DASH playback breakage by aligning fetch CORS and MSE audio behavior with spec and real decoder limits.

CORS / Range: _zwPreNamesOf no longer always treats Range as a preflight trigger. A single simple range matching bytes=\d+-\d* is CORS-safelisted (GET only); suffix, multi-range, and malformed values still force OPTIONS. New integration test test_fetch_range_safelisted_preflight_t8s4 locks simple vs multi-range vs custom-header behavior.

MSE audio (dual face): MediaSource.isTypeSupported now reports false for HE-AAC (mp4a.40.5) and only claims AAC-LC (mp4a.40.2 / aac) when the audio append bridge is present—matching symphonia’s LC-only decode. addSourceBuffer is decoupled: it accepts the broader mp4a.40.x / aac family on the ingest path (like Chrome) so sourceopen handlers can create audio SBs; decode failures degrade to mute rather than blocking video. Tests in part09.rs assert isTypeSupported(40.5)=false while addSourceBuffer(40.5) still creates an audio track.

Reviewed by Cursor Bugbot for commit 93db1b2. Bugbot is set up for automated code reviews on this repo. Configure here.

bilibili 起播断链三角化终证(beacon 探针 + curl 双证):_zwPreNamesOf 把
Range 头当自定义头 → 跨域 GET 误发 CORS OPTIONS preflight → bilivideo CDN
对 OPTIONS 拒答(带 Origin 的 GET 回条件 ACAO;无 Origin/OPTIONS 无)→
预检失败 → 全 CDN 候选 TypeError: Failed to fetch → init 永不 append →
watchdog detach/retry 死循环。fetch spec 2022+ 已将 Range 纳入
CORS-safelisted(单一 simple range),Chrome/FF 拉媒体段从不预检。

- part01.js _zwPreNamesOf:Range 值为单一 simple range(bytes=start-end /
  start- / -suffix)免 preflight;多段/畸形仍触发。红绿钉测三臂(simple
  零 OPTIONS / 多段预检 / 普通自定义头守卫;红态变异=恢复旧行为后第一臂
  精准变红,/tmp md5 恢复)。
- part06.js:isTypeSupported 音频真值收窄 mp4a.40.2+aac(symphonia-codec-aac
  源码定谳只解 AAC-LC,sbr_present 显式拒——HE-AAC 40.5 宣称 true 为虚报,
  真站实测命中);addSourceBuffer 与解码面解耦为 ingest 面(40.x 家族受理
  ——实测 bilibili 未登录默认音轨 30216=HE-AAC,解码面硬拒使 nano
  sourceopen handler 中断、双轨 append 全死;ingest 受理后双 SB 创建成功)。
  桥存在门保留(t8n 契约零回归)。
- part09.rs:双面钉(isTypeSupported(40.5)=false 解码面诚实 +
  addSourceBuffer(40.5)=created:audio ingest 面受理)。

真站读数(decode-h264 构建,beacon 探针):修复前段拉取全线 Failed to
fetch;修复后 playurl fnval=4048 dash:1 → sourceopen 派发 → 双 SB 创建
(ASB_OK×2)→ 段拉取 FR 206。公开面两阶段推进(CORS 拉取面 + SB 创建面);
appendBuffer 管道仍有 nano 内部断链(另切片),起播未达成——诚实口径。

测试:engine 2987P(+2 钉;skip 1 基线既有栈溢出项)。门禁:fmt CLEAN、
clippy workspace+quickjs 双腿 -D warnings、make test exit 0。
@cursor

cursor Bot commented Oct 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: 08406b27-c6a2-488e-906f-f3d9fed28d71)

两首轮均 PASS(①测试有效性 0 阻断 4 非阻断;②缺陷 0 阻断 5 非阻断),
统一收口:

- D1:Range safelist 正则收紧 /bytes=\d+-\d*/(精确对齐 fetch spec
  parse-a-single-range:无空白、start 必填、大小写敏感;suffix bytes=-500
  spec 明言不 safelist)+ 分支注释 spec 转述修正 + 函数头「恒入列」矛盾
  修正(D4)。
- D2:appendBuffer 轨路由注释对齐实际行为(无门面构建 SB 创建成功而
  append 恒败,error 事件面——非不可达)。
- D3:ingest codecs 提取补单引号形态(codecs='…' 角语法对齐 base)。
- D5:part10 调试残留删除。
- 新增 suffix range 拒绝臂(bytes=-500 → OPTIONS 先行;收紧正则的红态
  回归守卫——宽松正则变异下该臂精准变红)。

门禁:fmt CLEAN、clippy 双腿 -D warnings、engine 2996P(+suffix 臂)、
make test 复验待跑(本轮 make test 后改动面仅注释+正则+钉测)。
@cursor

cursor Bot commented Oct 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: 1cef9048-4068-4492-8679-7bd709927b5d)

@leizongmin
leizongmin merged commit e98a00d into main Oct 11, 2026
2 checks passed
leizongmin added a commit that referenced this pull request Oct 12, 2026
…hub(imported-tests.txt 双保留)

同步 main(#140–#144:R5073–R5079 layout/css 修复、webmessaging M2/M3、CORS range
safelist、shape_fallback 中文字体 fallback chain)。冲突仅 tests/wpt-runner/
imported-tests.txt:双方新增条目均保留(main 4 条 + 本分支
css-fonts/system-ui-bold-zw-001 1 条),无产品代码手工改动。

Co-Authored-By: Claude Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant